.TITLE DRDSP .IDENT /15.02/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 12-AUG-73 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ; ; J. R. KAUFFMAN ; J. M. LAWLER ; T. LEKAS ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; B. S. MCCARTHY ; L. B. MCCULLEY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ; ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY: ; ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY: ; ; B. S. MCCARTHY 27-JUL-88 15.02 ; ; BM430 -- ADD ABILITY TO USE UNIVERSAL RECEIVER TASK ; ; DIRECTIVE DISPATCHER ; ; MACRO LIBRARY CALLS ; .MCALL HDRDF$,HWDDF$,TCBDF$,WDBDF$ HDRDF$ ;DEFINE TASK HEADER OFFSETS HWDDF$ ;DEFINE HARDWARE REGISTERS TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS WDBDF$ ;DEFINE USER WINDOW DEF BLOCK OFFSETS ; ; DEFINE SIZE OF LARGEST DPB TO BE COPIED INTO EXEC. ANY CHANGES TO THIS ; ASSIGNMENT MUST BE REFLECTED IN THE DPB BUFFER SIZE IN SYSCM. ; DPBMAX = 16. ;RPOI IS 16 WORDS LONG ;+ ; **-$TRTRP-TRAP TRAP ; ; THIS ROUTINE IS TRAPPED TO WHEN A TRAP INSTRUCTION IS EXECUTED. IF THE ; STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS TO BE RETURNED. ELSE ; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ; ; INPUTS: ; ; 2(SP)=PS WORD PUSHED BY TRAP INSTRUCTION. ; 0(SP)=PC WORD PUSHED BY TRAP INSTRUCTION. ; ; OUTPUTS: ; ; IF THE STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS RETURNED. ; ELSE CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ;- .ENABL LSB .IF NDF D$$PAR $TRTRP::TST $STKDP ;;;STACK DEPTH ZERO? BNE $EMTRP ;;;IF NE NO MOV (SP)+,R0 ;;;GET ADDRESS + 2 OF TRAP INSTRUCTION MFPI -(R0) ;;;PICK UP TRAP INSTRUCTION .IFF ; NDF D$$PAR $TRTR1:: ;REFERENCE LABEL FOR DRSUB TRAP HANDLER .ENDC ; NDF D$$PAR MOVB (SP)+,R0 ;;;RETRIEVE DIRECTIVE STATUS MOV (SP),PS ;;;RESTORE TRAP PS FOR CORRECT PREV MODE MOV #$STACK-22,SP ;RELOAD EXEC STACK POINTER MOV R0,-(SP) ;SAVE DIRECTIVE STATUS BPL 1$ ;IF PL OKAY AS IS INC @$USRPS ;SET CARRY IN USER PS WORD .IF DF G$$GEF JMP 60$ ;IF ERROR SKIP GGEF COUNT UPDATE .ENDC ; DF G$$GEF 1$: JMP 59$ ;GO UPDATE GGEF USE COUNT ;+ ; **-$EMTRP-EMT TRAP ; ; THIS ROUTINE IS TRAPPED TO WHEN AN EMT INSTRUCTION IS EXECUTED. IF THE ; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE A TEST IS ; MADE TO SEE IF THE EMT INSTRUCTION HAD A CODE OF 377. IF NOT, THEN ; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ELSE THE ; APPROPRIATE DIRECTIVE IS EXECUTED. ; ; INPUTS: ; ; 2(SP)=PS WORD PUSHED BY EMT INSTRUCTION. ; 0(SP)=PC WORD PUSHED BY EMT INSTRUCTION. ; ; OUTPUTS: ; ; IF THE STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE ; CONTROL IS GIVEN TO THE EMT/TRAP SST ROUTINE OR A DIRECTIVE ROUTINE ; DEPENDENT ON WHETHER THE EMT HAD A CODE OF 377. ;- ; ; DETERMINE IF LEGITIMATE ENTRY FROM USER STATE. IF NOT, CRASH ; .IF NDF D$$PAR $EMTRP::TST $STKDP ;;;ARE WE AT STACK DEPTH +1? BGT 2$ ;;;IF GT YES JMP $CREMT ;;;ELSE CRASH SYSTEM ; ; DETERMINE IF ENTRY WAS VIA EMT 377. IF NOT PROCESS NON-RSX EMT ; 2$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY .IFF ; NDF D$$PAR $EMTR1:: ;REFERENCE LABEL FOR DRSUB TRAP HANDLER .IF DF K$$DAS MOV $DRAPR,KDSAR5 ;MAP COMMON IN I-SPACE AS WELL .ENDC ; DF K$$DAS .ENDC ; NDF D$$PAR MOV #$UMPC,R3 ;POINT TO USER PC MOV (R3)+,R5 ;GET ADDRESS OF EMT PLUS 2 MFPI -(R5) ;GET DIRECTIVE WORD CMP #104377,(SP) ;DIRECTIVE EMT? BEQ 3$ ;IF EQ YES JMP 80$ ;HANDLE NON-RSX EMT TRAP ; ; PUSH ASSUMED SUCCESFUL STATUS. DIRECTIVE PROCESSORS MAY: ; ; RETURN, IN WHICH CASE THE +1 IS THE DIRECTIVE STATUS ; OVERWRITE THE +1 AND RETURN, IN WHICH CASE THE NEW VALUE IS ; THE STATUS ; ISSUE A TRAP INSTRUCTION, IN WHICH CASE THE LOW BYTE OF THE ; TRAP IS THE RETURNED STATUS ; 3$: MOV #1,(SP) ;SET SUCCESSFUL DIRECTIVE STATUS ; ; IN ACCOUNTING SYSTEMS, CHARGE THE TASK WITH A DIRECTIVE ; .IF DF A$$CNT MOV $TKTCB,R0 ;POINT TO TCB OF CURRENT TASK MOV T.ACN(R0),R0 ;LOCATE ITS ACCOUNTING BLOCKS BEQ 5$ ;IF EQ, NO ACCOUNTING MOV #B.DIR,R1 ;GET OFFSET TO DIRECTIVE COUNT FIELD CALL $ADAT1 ;INCREMENT DIRECTIVE COUNT 5$: ; .ENDC ; ; POINT TO AND INITIALIZE DRDSP SCRATCH AREA IN DRTBL ; MOV #$USRPS,R5 ;POINT TO DISPATCH TABLE SCRATCH AREA MOV R3,(R5)+ ;SAVE ADDRESS OF USER PS BIC (SP),(R3)+ ;CLEAR CARRY IN USER PS WORD CLR (R5) ;INDICATE NO BYTES ; ; BEGIN VALIDATION OF DPB. GET TOP WORD OF STACK, CHECK TO SEE IF THE ; DPB IS ON THE STACK (ODD) OR POINTED TO BY STACK (EVEN). ; ; BETWEEN THE LABELS $DRLM1 AND $DRLM2, AN SST IN THE EXEC IS TREATED AS ; NON-FATAL AND IS CONVERTED TO A DIRECTIVE STATUS RETURN OF IE.ADP. THIS ; WAY WE CAN JUST ACCESS THE DPB WITHOUT THE EXPENSE OF ADDRESS CHECKING. ; MFPI SP ;GET USER STACK POINTER MOV (SP)+,R3 ; $DRLM1:: ;START OF AREA OF ALLOWED TRAPS IN SSTSR ;(BREAKPOINTS IN THIS AREA WILL NOT WORK) MFPD$ (R3)+ ;GET FIRST WORD ON USER STACK AND ;ADVANCE PAST IF DPB ON STACK BIT #1,(SP) ;DPB ON STACK? BNE 10$ ;IF NE YES ; ; DPB IS POINTED TO BY TOP OF STACK. SET $BTRMV TO 2 INDICATING REMOVE ; ONLY ADDRESS FROM STACK. REPLACE TOP WORD ON KERNEL STACK (DPB ADDRESS) ; WITH FIRST WORD OF DPB. ; MOV #2,(R5) ;INDICATE DPB POINTED TO BY STACK MOV (SP)+,R3 ;SET ADDRESS OF DPB MFPD$ (R3)+ ;GET FIRST WORD OF DPB AND POINT TO ;SECOND ; ; PICK UP FIRST DPB WORD FROM STACK, EXTRACT DIC, DPB SIZE ; 10$: MOV (SP),R1 ;PICK UP FIRST DPB WORD ; ; INITIALIZE FLAG WHICH INDICATES DPB VALID/INVALID. IF THIS IS A VALID ; DIRECTIVE, WE WILL REPLACE THIS FLAG WITH THE ADDRESS OF THE DIRECTIVE ; PROCESSING ROUTINE LATER. ; CLR (SP) ;ASSUME ILLEGAL DIC OR DPB WORD MOV R1,R4 ;COPY FIRST DPB WORD CLR R0 ; BISB R1,R0 ;EXTRACT DIC BYTE CLRB R4 ;CLEAR LOW BYTE OF COPY SWAB R4 ;SWAP DPB SIZE TO LOW BYTE BMI 346$ ;IF MI ILLEGAL DPB SIZE ASL R4 ;CONVERT TO BYTES TO REMOVE AT EXIT TST (R5)+ ;DPB ON STACK ? BNE 15$ ;IF NE NO MOV R4,-2(R5) ;SET BYTES TO REMOVE ON EXIT 15$: MOV R1,(R5)+ ;SAVE FIRST WORD IN $DICSV ; ; WE NOW HAVE: ; ; R0 = DIRECTIVE IDENTIFICATION CODE (DIC) ZERO PADDED TO 16 BITS. ; R1 = DPB SIZE IN BYTES (NUMBER OF BYTES TO REMOVE FROM STACK) ; R3 = VIRTUAL ADDRESS OF FIRST WORD IN DPB ; ; $DICSV = FIRST WORD OF DPB (SAVED COPY SO THAT COMMON ROUTINES ; CAN DETERMINE WHICH DIRECTIVE WAS EXECUTED) ; ; ; INITIALIZE GROUP GLOBAL EVENT FLAG POINTERS ; .IF DF G$$GEF MOV #$GEFPT+2,$GEFPT ;INIT GRP GLOBAL USE COUNT POINTER MOV #$GEFPT+2,$GFTCB ;INIT GRP GLOBAL USER TCB POINTER .ENDC ; DF G$$GEF ; ; VALIDATE DIC AND CONVERT TO POINTER INTO TABLE OF TWO WORD ENTRIES ; FOR DIRECTIVES. ; ASR R0 ;DIVIDE CODE BY 2 BCC 357$ ;IF CC ILLEGAL DIC CMP R0,#HI$DIC ;IS DIC OUT OF RANGE? BHI 357$ ;IF HI YES ASL R0 ;CONVERT TO DOUBLE WORD INDEX ADD #$DSTAB+1,R0 ;POINT TO COMPLEMENT OF DPB SIZE ; ; GET NEGATIVE OFFSET INTO MOVE TABLE FROM DIRECTIVE TABLE. THIS USES ; THE LEFTOVER BYTE AND SAVES A FEW INSTRUCTIONS. ; MOVB (R0),R2 ;GET COMPLEMENT OF LENGTH*4 ; ; VALIDATE THAT EITHER DPB SIZE MATCHES THAT SHOWN IN THE TABLE OR THAT ; THE DIRECTIVE CODE WILL VERIFY THE SIZE (SIZE IN TABLE = 0 ). ; CMPB R4,-(R0) ;DPB SIZE MATCH ? BEQ 34$ ;IF EQ YES CMP (PC)+,R1 ;IS IT GMCR$ DIRECTIVE ? .BYTE 127.,41. ;DIC, DPB SIZE ? BEQ 34$ ;IF EQ YES TSTB (R0) ;DEFER CHECKING FOR VARIABLE LENGTH DPB? 346$: BNE 357$ ;IF NE NO, ILLEGAL DPB SIZE MOV R4,R2 ;COPY SIZE IN BYTES ASL R2 ;CONVERT TO DOUBLEWORDS CMP #DPBMAX*4,R2 ;DPB SIZE BIGGER THAN TRANSFER VECTOR ? BLO 357$ ;IF LO YES, ILLEGAL DPB SIZE NEG R2 ;CREATE JUMP INDEX ; ; REPLACE ZERO FLAG ON STACK WITH ADDRESS OF PROCESSING ROUTINE. THIS ; INDICATES TO THE CODE BELOW THAT THE DPB WAS VALID. ; 34$: MOV TB$SIZ(R0),(SP) ;GET ADDRESS OF DIRECTIVE ROUTINE BEQ 357$ ;IF EQ ILLEGAL DIC MOV 2*TB$SIZ(R0),R4 ;GET PROCESSING MASK FLAGS BYTE ; ; PROCESS " A C H K D B " FLAG - ADDRESS CHECK AND MAP 8 WORD ; PLAS DEFINITION BLOCK. ; ; FOR PLAS DIRECTIVES, WE TAKE THE ONE PARAMETER OUT OF THE DPB. THIS ; PARAMETER IS THE ADDRESS OF AN 8 WORD STRUCTURE (RDB OR WDB). WE ; VALIDATE READ/WRITE ACCESS TO THE BLOCK AND PASS THIS BLOCK, RATHER ; THAN THE DPB, TO THE DIRECTIVE PROCESSING ROUTINE. ; ; ON SYSTEMS SUPPORTING EXTERNAL TASK HEADERS, THE WDB/RDB ; IS COPIED INTO THE EXECUTIVE INTERMEDIATE BUFFER AREA ; (STARTING ADDRESS $DICSV) SO THAT KERNEL APR6 CAN BE USED ; EXCLUSIVELY TO MAP THE ISSUING TASK HEADER. SINCE THE DIRECTIVE ; PROCESSING ROUTINES WILL NOT BE MANIPULATING THE USERS COPY ; OF THE WDB/RDB, IT WILL BE NECESSARY TO RETURN ANY OUTPUT FIELDS ; OF THE WDB/RDB AT THE COMPLETION OF DIRECTIVE PROCESSING ALONG ; WITH THE NORMAL DSW RETURN CODE. THE WORD CONTAINING THE NUMBER ; OF BYTES TO ADD TO THE USERS SP AT THE COMPLETION OF DIRECTIVE ; PROCESSING ($BTRMV) IS NEGATED TO INDICATE THAT THE ADDITIONAL ; OUTPUT FIELDS OF THE WDB/RDB MUST BE WRITTEN TO THE USER TASK. ; .IF DF P$$LAS BPL 345$ ;IF PL NOT A PLAS DIRECTIVE ; PUSH ADDRESS OF INTERMEDIATE LINKAGE FOR DISPATCHER FOR INTERMEDIATE ; CALL TO THIRD DIRECTIVE COMMON (NOTE THAT FOR THIS CASE, DRTBL DOES ; NOT HAVE THE ADDRESS SHIFTED RIGHT. MOV #$DRCL3,-(SP) ;PUSH ADDRESS OF LINKAGE ROUTINE MFPD$ (R3) ;PICK UP POINTER TO DEFINITION BLOCK MOV (SP)+,R3 ; MFPD$ (R3) ;READ/WRITE ACCESS TO FIRST WORD? MTPD$ (R3) ; MFPD$ 16(R3) ;READ/WRITE ACCESS TO LAST WORD? MTPD$ 16(R3) ; .IF DF X$$HDR NEG $BTRMV ;INDICATE ADDITIONAL OUTPUT FIELDS TO RETURN .ENDC ; DF X$$HDR MOV #16.,R2 ;SET SIZE FOR $RELCD CALL $RELCD ;RELOCATE/MAP PLAS DEF. BLOCK .IF DF X$$HDR MOV R3,(R5)+ ;SAVE KERNEL VA OF USER WDB/RDB MOV KISAR6,(R5)+ ;SAVE KERNEL MAPPING TO WDB/RDB .REPT MOV (R3)+,(R5)+ ;COPY USER WDB/RDB TO EXEC BUFFER .ENDR MOV #$DICSV+6,R3 ;POINT TO INTERNAL RDB/WDB MOV $SAHDB,KISAR6 ;MAP TO CURRENT TASK HEADER .ENDC ; DF X$$HDR BIC #WS.CRW!WS.UNM!WS.ELW!WS.RRF,W.NSTS(R3) MOV $TKTCB,R5 ;POINT TO TASK TCB FOR ROUTINES JMP 51$ ;JOIN COMMON DISPATCH CODE .ENDC ; DF P$$LAS 345$: ;REFERENCE LABEL ; ; HERE WE SPECIAL CASE THE GMCR$ DIRECTIVE AND ADDRESS CHECK THE DPB ; SINCE THE MFPD$ CHECKS WON'T WORK FOR DPB'S GREATER THAN 32. WORDS. ; CMP (PC)+,R1 ;MCR COMMAND LINE DIRECTIVE ? .BYTE 127.,41. ;DIC, DPB SIZE BNE 35$ ;IF NE NO SUB #2,R3 ;POINT BACK TO BEGINNING OF DPB ;(CAN'T USE TST, R3 NOT KERNEL ADDRESS) MOV #41.*2,R1 ;SET SIZE TO ADDRESS CHECK CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK READ/WRITE TST (R3)+ ;ADVANCE PASTFIRST WORD (TST OK NOW) BR 355$ ; ; ; HERE WE "ADDRESS CHECK" THE DPB BY COPYING IT TO AN INTERNAL BUFFER. ; THIS IS FASTER THAN A REAL ADDRESS CHECK AND ELIMINATES SEVERAL ; MAPPING PROBLEMS. ; 35$: JMP $DRLM2(R2) ;JUMP INTO TABLE OF MOVES .REPT DPBMAX MFPD$ (R3)+ ;GET ONE WORD FROM USER DPB MOV (SP)+,(R5)+ ;AND PUT IT IN OUR COPY .ENDR ; ; THERE MUST BE EXACTLY TWO WORDS BETWEEN THE END OF THE MOVE VECTOR ; AND THE LABEL $DRLM2. ; MOV #$DICSV+2,R3 ;POINT TO INTERNAL DPB ; ; THIS IS THE END OF THE CODE WHICH IS PROTECTED FROM TRAPS. ; $DRLM2:: ;END OF AREA OF A ALLOWED TRAPS AND ;NO BREAKPOINTS. ; ; MAP THE CURRENT TASK HEADER IF EXTERNAL HEADER SUPPORT. IT WILL ETIHER ; STAY MAPPED THROUGH THE DIRECTIVE, OR BE REMAPPED TO SEC. POOL TCB IF ; THE DIRECTIVE CAN USE THEM. ; .IF DF X$$HDR MOV $SAHDB,KISAR6 ;MAP TO CURRENT TASK HEADER .ENDC ; DF X$$HDR ; ; SET UP R5 TO POINT TO CURRENT TASK'S TCB FOR DIRECTIVE ROUTINES ; 355$: ;REFERENCE LABEL 357$: MOV $TKTCB,R5 ;POINT TO CURRENT TASK TCB ; ; SEE IF DIRECTIVE WAS LEGAL. IF NOT, SKIP FLAGS INTERPRETATION CODE. ; TST (SP) ;LEGAL DIC AND DPB SIZE? BNE 37$ ;IF NE, YES JMP 90$ ;IF EQ, ILLEGAL 37$: ;REFERENCE LABEL ; ; BEGIN TO SET UP PARAMETERS FOR DISPATCHING TO ROUTINE ; ; R5 = TCB ADDRESS OF TASK ISSUING DIRECTIVE ; SWAB R4 ;REARRANGE FLAGS TST R4 ;TEST FLAGS BEQ 50$ ;IF EQ NO OPTION CODE BMI 40$ ;IF MI TASK ORIENTED FLAGS ; ; PROCESS " C E F N C L " FLAG - CONVERT EVENT FLAG NUMBER TO ; ADDRESS/BIT MASK PAIR ; ; IF THE DIRECTIVE REQUIRES EVENT FLAG LOOKUP OR PROCESSING, DO SO. ; ROR R4 ;INCREMENT USE COUNT IF GRP GLOBAL ? BCS 38$ ;IF CS DON'T INCREMENT GRP GBL USE COUNT CALL $CEFNG ;CONVERT EFN AND LOCK IF GROUP GLOBAL BR 39$ ;JOIN COMMON CODE 38$: ;REF LABEL CALL $CEFN ;CONVERT EVENT FLAG NUMBER BIC #1,R1 ;CLR GROUP GLOBAL 2ND MASK INDICATOR 39$: BCC 50$ ;IF CC EVENT FLAG SPECIFIED ; ; PROCESS " C E F N M T " FLAG - EVENT FLAG MUST BE SPECIFIED ; ROR R4 ;EVENT FLAG REQUIRED ? BCC 50$ ;IF CC NO, OK ; ; REQUIRED EVENT FLAG NOT SPECIFIED ; DRSTS D.RS97 ;SET DIRECTIVE STATUS ; ; PROCESS " S R S T C L " FLAG - CALL $SRSTD TO LOOK UP TCB ; ; ; NOW PROCESS TASK LOOKUP OPTIONS. THE BEQ BELOW TAKES CARE OF BOTH THE ; CASE WHERE NO $SRSTD CALL IS SPECIFIED, AND THE CASE WHERE WE JUST ; FINISHED PROCESSING EVENT FLAGS. ; ; NOTE: ****************************************************** ; ; THIS SECTION SHOULD EVENTUALLY CALL $SRMUT EVEN IF $SRXXX FAILS. ; ; ; PROCESS " S E C T C B " FLAG - CALL $SRPRO TO LOOK UP TCB IN SECONDARY ; OR PRIMARY POOL TASK LISTS ; 40$: ASLB R4 ;TASK ALLOW SECONDARY POOL TCBS ? BPL 405$ ;IF PL NO CALL $SRPRO ;LOOK UP TASK NAME BCS 402$ ;IF CS TASK NOT FOUND BIT #1,R0 ;TCB IN SECONDARY POOL ? BEQ 401$ ;IF EQ NO DEC R0 ;POINT BACK TO APR BIAS MOV (R0),KISAR6 ;MAP TCB THROUGH APR6 MOV #140000,R0 ;POINT TO TCB 401$: CMP (R3)+,(R3)+ ;POINT PAST TASK NAME ; ; PROCESS " C R E T C B " FLAG - DIRECTIVE MAY CREATE TCB FROM ; MULTI-USER TASK TCB. ; ASLB R4 ;CAN DIRECTIVE CREATE A TCB ? BPL 43$ ;IF PL NO, DO MULTI-USER CHECKS BR 46$ ;ELSE YES, SKIP MU CHECKS ; ; $SRPRO OR $SRSTD COULD NOT FIND THE PROTOTYPE. SEE IF WE NEED ; TO SUBSTITUTE XXXTNN AND DO SO OR RETURN STATUS ; 402$: ASLB R4 ;CAN DIRECTIVE CREATE A TCB ? BMI 404$ ;IF MI YES, PROTO MUST EXIST ;(OR UNIVERSAL RECEIVER MUST BE USED) 403$: CMP (R3),#^R... ;TASK NAME FOLLOW MULTI-USER ;CONVENTION ? (...XXX) BNE 4035$ ;IF NE NO, PROTO MUST EXIST OR UNIVERSAL ;RECEIVER MUST BE TARGETED MOV 2(R3),R1 ;SET FIRST HALF OF MU TASK NAME MOV T.UCB(R5),R0 ;SET TERM UCB ADDRESS CMP (R3)+,(R3)+ ;ADVANCE PAST TASK NAME MOV R3,-(SP) ;AND SAVE DPB POINTER CALL $SRMUT ;LOOK FOR MU TASK TCB MOV (SP)+,R3 ;RESTORE DPB POINTER BCC 46$ ;IF CC MU TASK FOUND BR 404$ ;SKIP ENTRY POINT 4035$: CMP (R3)+,(R3)+ ;SKIP AROUND TASK NAME 404$: BIT #40,R4 ;IS THIS DIRECTIVE ELIGIBLE TO USE ;UNIVERSAL RECEIVER TASK? BEQ 110$ ;IF PL NO MOV $URTCB,R0 ;IS THERE A UNIVERSAL RECEIVER? BNE 46$ ;YES, USE IT BR 110$ ;ELSE ERROR ; ; PROCESS " D F C T S K " FLAG - TASK NAME DEFAULTS TO CURRENT TASK ; 405$: ASLB R4 ;TASK NAME DEFAULT TO CURRENT TASK ? BPL 41$ ;IF PL NO MOV R5,R0 ;PICK UP CURRENT TASK TCB TST (R3) ;TASK NAME SPECIFIED? BEQ 42$ ;IF EQ NO 41$: CALL $SRSTD ;SEARCH STD FOR TASK NAME BCS 403$ ;IF CS TASK NOT IN SYSTEM 42$: CMP (R3)+,(R3)+ ;ADVANCE PAST TASK NAME ; ; IF SPECIFIED TASK IS A MULTI-USER (...XXX) TASK, LOOK FOR LOCAL COPY ; 43$: CMP T.NAM(R0),#^R... ;DOES NAME FOLLOW MULTI-USER CONVENTION ? BNE 46$ ;IF NE NO MOV R0,-(SP) ;SAVE TCB POINTER MOV R3,-(SP) ;SAVE DPB POINTER MOV T.NAM+2(R0),R1 ;PICK UP FIRST WORD OF COPY'S TASK NAME MOV T.UCB(R5),R0 ;PICK UP TI: UCB FOR NAME CALCULATION CALL $SRMUT ;SEARCH STD FOR MULTIUSER TASK COPY MOV (SP)+,R3 ;RESTORE DPB POINTER BCC 45$ ;IF CC COPY FOUND MOV (SP),R0 ;RESTORE ORIGINAL TCB ADDRESS 45$: TST (SP)+ ;CLEAN STACK 46$: ;REF LABEL ; ; PROCESS " M U P C H K " FLAG - PERFORM MULTI-USER PROTECTION CHECKS. ; ASLB R4 ;PERFORM MULTI-USER PROTECTION CHECK ? BPL 49$ ;IF PL NO BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED? BNE 49$ ;IF NE YES BIT #T3.SLV,T.ST3(R0) ;TARGET TASK A SLAVE TASK? BNE 120$ ;IF NE YES, DON'T ALLOW CMP T.UCB(R5),T.UCB(R0) ;CURRENT AND TARGET TASK UCBS MATCH? BNE 120$ ;IF NE NO ; ; SET UP PARAMETERS FOR DIRECTIVE PROCESSING ROUTINE ; 49$: MOV R0,R1 ;COPY TCB ADDRESS ADD #T.STAT,R1 ;POINT TO TASK STATUS WORD 50$: ;REFERENCE LABEL .IF DF D$$PAR ASL (SP) ;DIRECTIVE IN FIRST OR SECOND COMMON ? BCC 51$ ;IF CC ITS IN FIRST MOV #$DRCL2,-(SP) ;PUSH ADDRESS OF LINKAGE ROUTINE .ENDC ; DF D$$PAR 51$: MOV R5,R2 ;SET POINTER TO SECOND TASK STATUS WORD ADD #T.ST2,R2 ; ;+ ; ** W A R N I N G ** ; ; SPM HOOKPOINT NUMBER 01. ; ; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM ;- $SPH01==. ;SPM CHANGES THE INSTRUCTION AT ;THE LOCATION OF THIS LABEL MOV @#$SAHPT,R4 ;POINT TO CURRENT TASK HEADER ; ; CALL DIRECTIVE ROUTINE WITH THE FOLLOWING ARGUMENTS: ; ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R3=ADDRESS OF THE NEXT WORD IN THE DIRECTIVE DPB. ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R1=DEPENDENT ON DIRECTIVE. ; R0=DEPENDENT ON DIRECTIVE. ; 55$: CALL @(SP)+ ;CALL DIRECTIVE ROUTINE .IF DF D$$PAR $DRFIN:: ;REFERENCE LABEL FOR COMMON LINK ROUTINES .ENDC ; DF D$$PAR ; ; INCREMENT GROUP GLOBAL USE COUNTS (OR SCRATCH WORD IF DIRECIVES ; DON'T USE GROUP GLOBALS) ; 59$: ;REFERENCE LABEL .IF DF G$$GEF INC @$GEFPT ;INCREMENT GROUP GLOBAL USE COUNT INCB @$GFTCB ;INC GRP GLOBAL USE COUNT FOR TASK .ENDC ; DF G$$GEF ; ; WRITE DIRECTIVE STATUS BACK INTO TASK ; 60$: MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORD ; ; IF THE NUMBER OF BYTES TO REMOVE FROM USER STACK IS NEGATIVE, THEN ; WE HAVE JUST PROCESSED A PLAS DIRECTIVE. WE MUST RETURN THE OUTPUT ; FIELDS TO THE USER TASK (RDB/WDB) FROM THE INTERMEDIATE BUFFER AREA ; ; OUTPUT FIELDS IN WDB/RDB ; ; W.NID W.NBAS W.NRID W.NLEN W.NOFF W.NSTS ; R.GID R.GSIZ R.GSTS ; .IF DF X$$HDR TST $BTRMV ;JUST FINISHED A PLAS DIRECTIVE ? BPL 65$ ;IF PLUS, NO NEG $BTRMV ;YES, TURN OFF FLAG MOV #$DICSV+2,R0 ;POINT TO INTERMEDIATE EXEC BUFFER MOV (R0)+,R1 ;RESTORE KERNEL VA OF WDB/RDB MOV (R0)+,KISAR6 ;MAP USERS WDB/RDB MOV (R0)+,(R1)+ ;W.NID R.GID MOV (R0)+,(R1)+ ;W.NBAS R.GSIZ CMP (R0)+,(R1)+ ;W.NSIZ R.GNAM (SKIP) MOV (R0)+,(R1)+ ;W.NRID R.GNAM MOV (R0)+,(R1)+ ;W.NOFF R.GPAR MOV (R0)+,(R1)+ ;W.NLEN R.GPAR MOV (R0)+,(R1)+ ;W.NSTS R.GSTS 65$: ;REFERENCE LABEL .ENDC ; DF X$$HDR ; ; GET USER STACK POINTER AND UPDATE TO REMOVE DPB OR ADDRESS OF DPB FROM ; THE STACK. ; MFPI SP ;GET USER STACK POINTER ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK MTPI SP ;RESTORE USER STACK POINTER ; ; END OF DIRECTIVE PROCESSING, GO BACK TO SYSTEM ENTRANCE/EXIT ROUTINES. ; RETURN ;EXIT FROM TRAP ; ; EMT/TRAP SST ROUTINE TRANSFER ; 80$: ;REFERENCE LABEL .IF DF X$$HDR MOV $SAHPT,R5 ;GET ADDR OF CURRENT TASK HEADER MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER .IFF MOV $HEADR,R5 ;GET ADDR OF CURRENT TASK HEADER .ENDC ;X$$HDR MOV H.WND(R5),R5 ;POINT TO NUMBER OF WINDOW BLOCKS TST W.BLVR+2(R5) ;CURRENT TASK MAPPED TO EXEC? BEQ 85$ ;IF EQ NO CMP (SP),#104376 ;IS THIS A CALL TO $SWSTK? BNE 85$ ;IF NE NO JMP $SWSTK ;PROCESS CALL TO $SWSTK 85$: JMP $EMSST ;PROCESS SST FAULT ; ; ILLEGAL DIRECTIVE ; 90$: DRSTS D.RS99 ;SET DIRECTIVE STATUS ; ; REQUIRED EVENT FLAG NUMBER NOT SPECIFIED ; 100$: DRSTS D.RS97 ;SET DIRECTIVE STATUS ; ; SPECIFIED TASK NAME NOT FOUND IN TASK DIRECTORY ; 110$: DRSTS D.RS2 ;SET DIRECTIVE STATUS ; ; PRIVILEGE VIOLATION ; .IF DF M$$MUP 120$: DRSTS D.RS16 ;SET DIRECTIVE STATUS .ENDC ; ; ALLOCATION FAILURE ; .IF DF R$$DSP 130$: DRSTS D.RS1 ;SET DIRECTIVE STATUS .ENDC .DSABL LSB .END